package pedido

import util.GerenciadorTabelas;
import java.util.Vector;
import java.util.ArrayList;
import ws.PedidoCompra;
import ws.PedidoCompraItem;
import ws.BuscaChaveEstrangeira;
import ws.BuscaChaveEstrangeiraVetor;
import wsgroovy.ManagerWebService;
import java.text.SimpleDateFormat;

class PedidoCompraMercadoriaController {
    
    def index = {
        redirect action:"list", params:params 
    }

    // the delete, save and update actions only accept POST requests
    static allowedMethods = [delete:'POST', save:'POST', update:'POST']

    def list = {
        GerenciadorTabelas.getInstance().getParams().clear();

        def proxy = ManagerWebService.getInstance().getProxy()
        ArrayList<PedidoCompra> lista = new ArrayList<PedidoCompra>();

        //gambiarra para ver se ja foi atribuido 'def pedidoCompra' com o tipo de classe lá do BPEL
        if( (params.buscaPedidosFornecedor == null) && (ManagerWebService.getInstance().getPedidoCompra().getClass() == String.class) ){
            def ped = proxy.readPedidoPorId(-1)
            ManagerWebService.getInstance().setPedidoCompra(ped);
        }

        //só faz a chamada do Web Service se foi digitado alguma coisa (aceita String vazia, barra de espaços e semelhantes)
        if(params.buscaPedidosFornecedor != null){
            SimpleDateFormat s = new SimpleDateFormat();
            s.applyPattern("dd/MM/yyyy");
            String data = s.format(new Date(new Integer(params.buscaPedidosData_year)-1900,
                    new Integer(params.buscaPedidosData_month)-1,
                    new Integer(params.buscaPedidosData_day)));
            def pedVetor = proxy.readPedido(data, params.buscaPedidosFornecedor)
            ManagerWebService.getInstance().setPedidoCompra(pedVetor.getLista().get(0));
            lista = pedVetor.getLista();

            if(lista.get(0).getTcodigoPk() == -1){  //"desfaz a gambiarra com outra gambiarra hehehe"
                lista.clear();
            }
        }
        
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        [pedidoCompraMercadoriaInstanceList: lista]
    }

    def show = {
        //def pedidoCompraMercadoriaInstance = PedidoCompraMercadoria.get( params.id )
        //PedidoCompra pedido = GerenciadorTabelas.getInstance().getPedidoPorId(Integer.parseInt(params.id));
        def pedidoCompraMercadoriaInstance = ManagerWebService.getInstance().getProxy().readPedidoPorId(params.id)
        ArrayList<PedidoCompraItem> lista = pedidoCompraMercadoriaInstance.getPedidoCompraItemList();
        
        if(!pedidoCompraMercadoriaInstance) {
            flash.message = "PedidoCompraMercadoria not found with id ${params.id}"
            redirect(action:list)
        }
        else {
            [ pedidoCompraMercadoriaInstance : pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista ]
        }
    }

    def delete = {
        //def pedidoCompraMercadoriaInstance = PedidoCompraMercadoria.get( params.id )
        //boolean wasDeleted = GerenciadorTabelas.getInstance().deletarPedido(Integer.parseInt(params.id));
        boolean wasDeleted = ManagerWebService.getInstance().getProxy().deletePedido(params.id);

        if(wasDeleted) {
            flash.message = "Pedido ${params.id} deletado"
        }
        else {
            flash.message = "Pedido não deletado ou não encontrado com id ${params.id}"
        }
        redirect(action:"list")
    }

    def edit = {
        //def pedidoCompraMercadoriaInstance = PedidoCompraMercadoria.get( params.id )
        //PedidoCompra pedido = GerenciadorTabelas.getInstance().getPedidoPorId(Integer.parseInt(params.id));
        def pedidoCompraMercadoriaInstance = ManagerWebService.getInstance().getProxy().readPedidoPorId(params.id)
        ArrayList<PedidoCompraItem> lista = pedidoCompraMercadoriaInstance.getPedidoCompraItemList();
        
        if(!pedidoCompraMercadoriaInstance) {
            flash.message = "PedidoCompraMercadoria not found with id ${params.id}"
            redirect action:'list'
        }
        else {
            return [ pedidoCompraMercadoriaInstance : pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista ]
        }
    }

    //não se faz UPDATE de pedido
    def update = {
        flash.message = "Operação UPDATE em manutenção..."

        redirect action:'list'
        //        println "UPDATE: " + params
        //        //def pedidoCompraMercadoriaInstance = PedidoCompraMercadoria.get( params.id )
        //        //PedidoCompra pedido = GerenciadorTabelas.getInstance().getPedidoPorId(Integer.parseInt(params.id));
        //        def pedidoCompraMercadoriaInstance = ManagerWebService.getInstance().getProxy().readPedido(params.id)
        //        ArrayList<PedidoCompraItem> lista = pedidoCompraMercadoriaInstance.getPedidoCompraItemList();
        //
        //        if(pedidoCompraMercadoriaInstance) {
        //            if(params.version) {
        //                def version = params.version.toLong()
        //                if(pedidoCompraMercadoriaInstance.version > version) {
        //
        //                    pedidoCompraMercadoriaInstance.errors.rejectValue("version", "pedidoCompraMercadoria.optimistic.locking.failure", "Another user has updated this PedidoCompraMercadoria while you were editing.")
        //
        //                    render view:'edit', model:[pedidoCompraMercadoriaInstance:pedidoCompraMercadoriaInstance]
        //                    return
        //                }
        //            }
        //            //pedidoCompraMercadoriaInstance.properties = params
        //
        //            //if(!pedidoCompraMercadoriaInstance.hasErrors() && pedidoCompraMercadoriaInstance.save()) {
        ////            if(!params.tacordo_frete.equalsIgnoreCase("")){
        ////                pedido.setTacordo_frete(params.tacordo_frete);
        ////                pedido.setTobs(params.tobs);
        ////                pedido.setTstatus_pedido_chk(params.tstatus_pedido_chk);
        ////                GerenciadorTabelas.getInstance().atualizarPedido(pedido);
        //                flash.message = "Pedido ${params.id} atualizado"
        //
        //                //redirect action:'show', id:pedidoCompraMercadoriaInstance.id
        //                redirect action:'list'
        ////            }
        ////            else {
        ////                //flash.message = "Pedido ${params.id} atualizado"
        ////                render view:'edit', model:[pedidoCompraMercadoriaInstance:pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista, pedidoCompraMercadoriaInstanceTotal: lista.size()]
        ////                return
        ////            }
        //        }
        //        else {
        //            flash.message = "PedidoCompraMercadoria não encontrado com id ${params.id}"
        //            redirect action:'list'
        //        }
    }

    def create = {
        Vector<PedidoCompraItem> lista = GerenciadorTabelas.getInstance().getPedidoItens();
        def pedidoCompraMercadoriaInstance = new PedidoCompraMercadoria()

        if(GerenciadorTabelas.getInstance().getParams().isEmpty()){
            pedidoCompraMercadoriaInstance.properties = params
        }
        else{
            pedidoCompraMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
            GerenciadorTabelas.getInstance().resetMap();
            println "Valores depois: " + GerenciadorTabelas.getInstance().getParams()
        }
        //pedidoCompraMercadoriaInstance.properties = params
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
        return ['pedidoCompraMercadoriaInstance':pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista]
    }

    def save = {
        Vector<PedidoCompraItem> lista = GerenciadorTabelas.getInstance().getPedidoItens();
        def pedidoCompraMercadoriaInstance = new PedidoCompraMercadoria()
        pedidoCompraMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
        pedidoCompraMercadoriaInstance.properties = params

        if(!lista.isEmpty()) {
            flash.message = "Pedido de Compra efetuado!"

            PedidoCompra pedido = new PedidoCompra();
            pedido.setTcod_fornecedor_fk(pedidoCompraMercadoriaInstance.tcod_fornecedor_fk);
            pedido.setTunidade_fk(pedidoCompraMercadoriaInstance.tunidade_fk)
            pedido.setTcondicao_compra_fk(pedidoCompraMercadoriaInstance.tcondicao_compra_fk);
            pedido.setTacordo_frete(pedidoCompraMercadoriaInstance.tacordo_frete);
            pedido.setTobs(pedidoCompraMercadoriaInstance.tobs);
            pedido.setTstatus_pedido_chk(pedidoCompraMercadoriaInstance.tstatus_pedido_chk);
            pedido.setPedidoCompraItemList(new Vector(lista));

            String isValid = GerenciadorTabelas.getInstance().validarPedido(pedido);
            if(isValid.isEmpty()){
                //Hora de fazer o "cast" gambiarrístico
                def p = ManagerWebService.getInstance().getPedidoCompra()
                p.setTcodigoPk(pedido.getTcodigo_pk());
                p.setTcodFornecedorFk(pedido.getTcod_fornecedor_fk());
                p.setTunidadeFk(pedido.getTunidade_fk());
                p.setTdata(pedido.getTdata());
                p.setTcondicaoCompraFk(pedido.getTcondicao_compra_fk());
                p.setTdataPrevisaoFaturamento(pedido.getTdata_previsao_faturamento());
                p.setTacordoFrete(pedido.getTacordo_frete());
                p.setTvalorPedido(pedido.getTvalor_pedido());
                p.setTsaldoAEntregar(pedido.getTsaldo_a_entregar());
                p.setTqtdeItensMerc(pedido.getTqtde_itens_merc());
                p.setTobs(pedido.getTobs());
                p.setTstatusPedidoChk(pedido.getTstatus_pedido_chk());
                p.setTusuarioCompradorFk(pedido.getTusuario_comprador_fk());
                p.setTvalorBruto(pedido.getTvalor_bruto());
                p.setTdescontoPerc(pedido.getTdesconto_perc());
                p.setTdescontoValor(pedido.getTdesconto_valor());
                p.setTvalorLiquidoPedido(pedido.getTvalor_liquido_pedido());
                p.setTcotacaoFk(pedido.getTcotacao_fk());

                for(PedidoCompraItem i : lista){
                    def pci = ManagerWebService.getInstance().getPedidoCompraItem()
                    pci = pci.getClass().newInstance();
                    pci.setTcodPedidoFpk(i.getTcod_pedido_fpk())
                    pci.setTcodMercFpk(i.getTcod_merc_fpk())
                    pci.setTqtdeCompra(i.getTqtde_compra())
                    pci.setTprecoCompra(i.getTpreco_compra())
                    pci.setTqtdeChegada(i.getTqtde_chegada())
                    pci.setTprecoCompraLiquido(i.getTpreco_compra_liquido())
                    pci.setTcodigoOriginal(i.getTcodigo_original())
                    pci.setTdescontoPedPerc(i.getTdesconto_ped_perc())
                    pci.setTdescontoPedValor(i.getTdesconto_ped_valor())
                    pci.setTvalorLiquido(i.getTvalor_liquido())
                    pci.setTvalorTotal(i.getTvalor_total())

                    p.getPedidoCompraItemList().add(pci);
                }
                def proxy = ManagerWebService.getInstance().getProxy()

                if(proxy.createPedido(p) == true){
                    flash.message = "Pedido gerado!"
                    GerenciadorTabelas.getInstance().getPedidoItens().clear();
                }
                else{
                    flash.message = "Pedido não gerado!"
                }
                //depois de finalizada a operação, o vetor das parcelas é ZERADO
                p.getPedidoCompraItemList().clear()                
            }
            else{
                flash.message = isValid
            }
            redirect action:'list'
        }
        else {
            flash.message = "Cadastre ao menos 1 item!!"
            render view:'create', model:[pedidoCompraMercadoriaInstance:pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista]
        }
    }

    def insereItem = {
        
        Vector<PedidoCompraItem> lista = GerenciadorTabelas.getInstance().getPedidoItens();
        def pedidoCompraMercadoriaInstance = new PedidoCompraMercadoria()
        pedidoCompraMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
        pedidoCompraMercadoriaInstance.properties = params

        pedidoCompraMercadoriaInstance.tcodigo_pk = 1
        if(pedidoCompraMercadoriaInstance.validate()){

            //Converte tpreco_compra para BigDecimal
            String pc = pedidoCompraMercadoriaInstance.tpreco_compra;
            pc = pc.replace(".", "");
            pc = pc.replace(",", ".");
            BigDecimal precoCompra = new BigDecimal(pc);
            println "Valor decimal: " + pedidoCompraMercadoriaInstance.tpreco_compra

            //Converte tdesconto_ped_valor para BigDecimal
            String dv = pedidoCompraMercadoriaInstance.tdesconto_ped_valor;
            dv = dv.replace(".", "");
            dv = dv.replace(",", ".");
            BigDecimal descontoValor = new BigDecimal(dv);

            //Converte tdesconto_ped_perc para BigDecimal
            String dp = pedidoCompraMercadoriaInstance.tdesconto_ped_perc;
            dp = dp.replace(".", "");
            dp = dp.replace(",", ".");
            BigDecimal descontoPerc = new BigDecimal(dp);

            //Converte tqtde_merc para Integer
            Integer qtdeCompra = new Integer(pedidoCompraMercadoriaInstance.tqtde_compra);

            //Converte tcod_merc_fpk para Integer
            Integer codMerc = new Integer(pedidoCompraMercadoriaInstance.tcod_merc_fpk);

            PedidoCompraItem item = new PedidoCompraItem();
            item.setTcod_merc_fpk(codMerc);
            item.setTqtde_compra(qtdeCompra);
            item.setTpreco_compra(precoCompra);
            item.setTdesconto_ped_perc(descontoPerc);
            item.setTdesconto_ped_valor(descontoValor);

            //precisa validar o Item e fazer os´cálculos...

            lista.add(item);
            params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

            flash.message = "Item inserido no Pedido!"
        }
        render view:'create', model:[pedidoCompraMercadoriaInstance:pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista, pedidoCompraMercadoriaInstanceTotal: lista.size()]
    }

    def searchUnidade = {
        //redirect action:"list", params:params
        render view:'searchUnidade', params:params
        GerenciadorTabelas.getInstance().setParams(new HashMap(params));
    }

    def selecionarUnidade = {
        GerenciadorTabelas.getInstance().getParams().put("tunidade_fk", params.id)
        Vector<PedidoCompraItem> lista = GerenciadorTabelas.getInstance().getPedidoItens();

        if(GerenciadorTabelas.getInstance().getParams().containsKey("id")){
            def pedidoCompraMercadoriaInstance = new PedidoCompraMercadoria()
            pedidoCompraMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
            println "Se contains ID: " + GerenciadorTabelas.getInstance().getParams()
            render view:'edit', model:[pedidoCompraMercadoriaInstance:pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista]
        }
        else{
            redirect action:'create'
        }
    }

    def buscarUnidadePorId = {

        def proxy = ManagerWebService.getInstance().getProxy()
        def unidadeFK = proxy.searchUnidadePorId(params.codigoUnidade);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(unidadeFK != null){
            lista = unidadeFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //render view:'create', model:[classificacaoFiscalList: lista, 'fornecedorDominioInstance':fornecedorDominioInstance]
        render view:'searchUnidade', model:[unidadeList: lista]
    }

    def buscarUnidadePorNome = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def unidadeFK = proxy.searchUnidadePorNome(params.nomeUnidade);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(unidadeFK != null){
            lista = unidadeFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //render view:'create', model:[classificacaoFiscalList: lista]
        render view:'searchUnidade', model:[unidadeList: lista]
    }

    def searchCondicao = {
        //redirect action:"list", params:params
        render view:'searchCondicao', params:params
        GerenciadorTabelas.getInstance().setParams(new HashMap(params));
    }

    def selecionarCondicao = {
        GerenciadorTabelas.getInstance().getParams().put("tcondicao_compra_fk", params.id)

        if(GerenciadorTabelas.getInstance().getParams().containsKey("id")){
            def pedidoCompraMercadoriaInstance = new PedidoCompraMercadoria()
            pedidoCompraMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
            render view:'edit', model:[pedidoCompraMercadoriaInstance:pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista]
        }
        else{
            redirect action:'create'
        }
    }

    def buscarCondicaoPorId = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def condicaoFK = proxy.searchCondicaoPorId(params.codigoCondicao);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(condicaoFK != null){
            lista = condicaoFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //[cidadeCEPList: lista, cidadeCEPListTotal: lista.size()]
        render view:'searchCondicao', model:[condicaoList: lista]
    }

    def buscarCondicaoPorDescricao = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def condicaoFK = proxy.searchCondicaoPorNome(params.descricaoCondicao);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(condicaoFK != null){
            lista = condicaoFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //[cidadeCEPList: lista, cidadeCEPListTotal: lista.size()]
        render view:'searchCondicao', model:[condicaoList: lista]
    }

    def searchMercadoria = {
        //redirect action:"list", params:params
        render view:'searchMercadoria', params:params
        GerenciadorTabelas.getInstance().setParams(new HashMap(params));
    }

    def selecionarMercadoria = {
        
        GerenciadorTabelas.getInstance().getParams().put("tcod_merc_fpk", params.id)

        if(GerenciadorTabelas.getInstance().getParams().containsKey("id")){
            def pedidoCompraMercadoriaInstance = new PedidoCompraMercadoria()
            pedidoCompraMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
            render view:'edit', model:[pedidoCompraMercadoriaInstance:pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista]
        }
        else{
            redirect action:'create'
        }
    }

    def buscarMercadoriaPorId = {

        println "Codigo: " + GerenciadorTabelas.getInstance().getParams();
        def proxy = ManagerWebService.getInstance().getProxy()
        def mercadoriaFK = proxy.searchMercadoriaPorId(params.codigoMercadoria);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(mercadoriaFK != null){
            lista = mercadoriaFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //render view:'create', model:[classificacaoFiscalList: lista, 'fornecedorDominioInstance':fornecedorDominioInstance]
        render view:'searchMercadoria', model:[mercadoriaList: lista]
    }

    def buscarMercadoriaPorNome = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def mercadoriaFK = proxy.searchMercadoriaPorNome(params.nomeMercadoria);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(mercadoriaFK != null){
            lista = mercadoriaFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //render view:'create', model:[classificacaoFiscalList: lista]
        render view:'searchMercadoria', model:[mercadoriaList: lista]
    }

    def searchFornecedor = {
        //redirect action:"list", params:params
        render view:'searchFornecedor', params:params
        GerenciadorTabelas.getInstance().setParams(new HashMap(params));
    }

    def selecionarFornecedor = {
        GerenciadorTabelas.getInstance().getParams().put("tcod_fornecedor_fk", params.id)
        
        if(GerenciadorTabelas.getInstance().getParams().containsKey("id")){
            def pedidoCompraMercadoriaInstance = new PedidoCompraMercadoria()
            pedidoCompraMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
            render view:'edit', model:[pedidoCompraMercadoriaInstance:pedidoCompraMercadoriaInstance, pedidoCompraMercadoriaInstanceList: lista]
        }
        else{
            redirect action:'create'
        }
    }

    def buscarFornecedorPorId = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def fornecedorFK = proxy.searchFornecedorPorId(params.codigoFornecedor);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(fornecedorFK != null){
            lista = fornecedorFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //[cidadeCEPList: lista, cidadeCEPListTotal: lista.size()]
        render view:'searchFornecedor', model:[fornecedorList: lista]
    }

    def buscarFornecedorPorNome = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def fornecedorFK = proxy.searchFornecedorPorNome(params.nomeFornecedor);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(fornecedorFK != null){
            lista = fornecedorFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //[cidadeCEPList: lista, cidadeCEPListTotal: lista.size()]
        render view:'searchFornecedor', model:[fornecedorList: lista]
    }
}